//
// Created by ROG on 2024/11/7.
//
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100  // 队列的最大容量

// 定义队列结构体
typedef struct {
    int data[MAX_SIZE];  // 队列存储数组
    int front;           // 队头指针
    int rear;            // 队尾指针
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

// 判断队列是否为空
int isEmpty(Queue *q) {
    return q->front == q->rear;
}

// 判断队列是否已满
int isFull(Queue *q) {
    return q->rear == MAX_SIZE;
}

// 入队操作
int enqueue(Queue *q, int value) {
    if (isFull(q)) {
        printf("队列已满，无法入队！\n");
        return -1;
    }
    q->data[q->rear] = value;
    q->rear++;
    return 0;
}

// 队列长度
int getLength(Queue *q){
    return q->rear - q->front;
}

// 出队操作，直接返回出队元素
int dequeue(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空，无法出队！\n");
        return -1;  // 使用 -1 表示错误，假设队列元素不包含 -1
    }
    return q->data[q->front++];
}

// 获取队头元素
int getFront(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空，没有队头元素！\n");
        return -1;
    }
    return q->data[q->front];
}

// 打印队列中的元素
void printQueue(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空！\n");
        return;
    }
    for (int i = q->front; i < q->rear; i++) {
        printf("%d ", q->data[i]);
    }
    printf("\n");
}

// 主函数测试队列操作
int main() {
    Queue q;
    initQueue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);
    printf("队列内容: ");
    printQueue(&q);

    int value = dequeue(&q);
    if (value != -1) {
        printf("出队元素: %d\n", value);
    }
    printf("队列内容: ");
    printQueue(&q);

    value = getFront(&q);
    if (value != -1) {
        printf("当前队头元素: %d\n", value);
    }

    return 0;
}
